home *** CD-ROM | disk | FTP | other *** search
- #include "xbmtools.h"
-
- /* these are here instead of the header file because they're not part
- of the library interface */
-
- // rol al
- #define ROL_AL 0xc0d0
- // mov [si + disp8], imm8
- #define SHORT_STORE_8 0x44c6
- // mov [si + disp16], imm8
- #define STORE_8 0x84c6
- // mov [si + disp8], imm16
- #define SHORT_STORE_16 0x44c7
- // mov [si + disp16], imm16
- #define STORE_16 0x84c7
- // adc si, imm8
- #define ADC_SI_IMMED 0xd683
- // out dx, al
- #define OUT_AL 0xee
- // ret
- #define RETURN 0xcb
- // 32-bit prefix
- #define DWORD_PREFIX 0x66
-
- #define Emitb(x) *(output + output_used) = (x); output_used++
-
- #define Emitw(x) *(output + output_used) = (x) & 255; \
- *(output + output_used + 1) = (x) >> 8; \
- output_used += 2
-
-
- int x_compile_bitmap_32 (int logical_screen_width, char far * bitmap,
- char far * output)
- {
- int pix0, pix1, pix2, pix3, numpix, pos;
- int column = 0, set_column = 0;
- int scanx = 0, scany = 0;
- int output_used = 0;
-
- int height = LBMHeight(bitmap);
- int width = LBMWidth(bitmap);
- int margin = width - 1;
- int margin2 = margin - 4;
- int margin4 = margin - 12;
-
- while (column < 4) {
- numpix = 1;
- pix0 = LBMGetPix(scanx, scany, bitmap);
- if (pix0 != 0) {
- if (set_column != column) {
- do {
- Emitw (ROL_AL);
- Emitw (ADC_SI_IMMED);
- Emitb (0);
- set_column++;
- } while (set_column != column);
- Emitb (OUT_AL);
- }
- if (scanx <= margin2) {
- pix1 = LBMGetPix(scanx + 4, scany, bitmap);
- if ((pix1 != 0)
- &&(scanx <= margin4)) {
- numpix = 2;
- pix2 = LBMGetPix(scanx + 8, scany, bitmap);
- pix3 = LBMGetPix(scanx + 12, scany, bitmap);
- if ((pix2 != 0) && (pix3 != 0)) {
- numpix = 4;
- Emitb (DWORD_PREFIX);
- }
- }
- }
- pos = (scany * logical_screen_width) + (scanx >> 2) - 128;
- if ((pos >= -128) && (pos <= 127)) {
- if (numpix == 1) {
- Emitw (SHORT_STORE_8);
- Emitb (pos);
- Emitb (pix0);
- } else {
- Emitw (SHORT_STORE_16);
- Emitb (pos);
- Emitb (pix0);
- Emitb (pix1);
- if (numpix == 4) {
- Emitb (pix2);
- Emitb (pix3);
- }
- }
- } else {
- if (numpix == 1) {
- Emitw (STORE_8);
- Emitw (pos);
- Emitb (pix0);
- } else {
- Emitw (STORE_16);
- Emitw (pos);
- Emitb (pix0);
- Emitb (pix1);
- if (numpix == 4) {
- Emitb (pix2);
- Emitb (pix3);
- }
- }
- }
- }
- scanx += (numpix << 2);
- if (scanx > margin) {
- scanx = column;
- scany++;
- if (scany == height) {
- scany = 0;
- column++;
- }
- }
- }
- Emitb(RETURN);
- return(output_used);
- }
-
-
- int x_sizeof_cbitmap_32 (int logical_screen_width, char far * bitmap)
- {
- int pix0, pix1, pix2, pix3, numpix, pos;
- int column = 0, set_column = 0;
- int scanx = 0, scany = 0;
- int output_used = 1;
-
- int height = LBMHeight(bitmap);
- int width = LBMWidth(bitmap);
- int margin = width - 1;
- int margin2 = margin - 4;
- int margin4 = margin - 12;
-
- while (column < 4) {
- numpix = 1;
- pix0 = LBMGetPix(scanx, scany, bitmap);
- if (pix0 != 0) {
- if (set_column != column) {
- do {
- output_used += 5;
- set_column++;
- } while (set_column != column);
- output_used++;
- }
- if (scanx <= margin2) {
- pix1 = LBMGetPix(scanx + 4, scany, bitmap);
- if ((pix1 != 0)
- &&(scanx <= margin4)) {
- numpix = 2;
- pix2 = LBMGetPix(scanx + 8, scany, bitmap);
- pix3 = LBMGetPix(scanx + 12, scany, bitmap);
- if ((pix2 != 0) && (pix3 != 0)) {
- numpix = 4;
- output_used++;
- }
- }
- }
- pos = (scany * logical_screen_width) + (scanx >> 2) - 128;
- if ((pos >= -128) && (pos <= 127)) {
- if (numpix == 1) {
- output_used += 4;
- } else {
- output_used += 5;
- if (numpix == 4)
- output_used += 2;
- }
- } else {
- if (numpix == 1) {
- output_used += 5;
- } else {
- output_used += 6;
- if (numpix == 4)
- output_used += 2;
- }
- }
- }
- scanx += (numpix << 2);
- if (scanx > margin) {
- scanx = column;
- scany++;
- if (scany == height) {
- scany = 0;
- column++;
- }
- }
- }
- return(output_used);
- }
-
-